package com.xiaoyilin.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.HeadersExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * Headers Exchange
 * <p>
 * 设置header attribute参数类型的交换机。相较于 direct 和 topic 固定地使用 routing_key , headers 则是一个自定义匹配规则的类型，忽略routing_key。
 * 在队列与交换器绑定时, 会设定一组键值对规则, 消息中也包括一组键值对( headers 属性), 当这些键值对有一对, 或全部匹配时, 消息被投送到对应队列。
 * ​ 在绑定Queue与Exchange时指定一组键值对，当消息发送到RabbitMQ时会取到该消息的headers与Exchange绑定时指定的键值对进行匹配。
 * 如果完全匹配则消息会路由到该队列，否则不会路由到该队列。headers属性是一个键值对，可以是Hashtable，键值对的值可以是任何类型。
 * <p>
 * 匹配规则x-match有下列两种类型：
 * <p>
 * x-match = all ：表示所有的键值对都匹配才能接受到消息
 * x-match = any ：表示只要有键值对匹配就能接受到消息
 */
@Configuration
public class RabbitHeaderConfig {

    @Bean(name = "myHeadersQueue")
    public Queue myHeadersQueue() {
        return new Queue("my.headers.queue");
    }

    @Bean
    public HeadersExchange myHeadersExchange() {
        return new HeadersExchange("my.headers.exchange");
    }

    @Bean
    Binding bindingExchangeTopicQueue(@Qualifier("myHeadersQueue") Queue myHeadersQueue, HeadersExchange headersExchange) {
        Map<String, Object> map = new HashMap<>(2);
        map.put("One", "A");
        map.put("Two", "B");

        //whereAll表示全部匹配
        //return BindingBuilder.bind(queue).to(headersExchange).whereAll(map).match();

        //whereAny表示部分匹配
        return BindingBuilder.bind(myHeadersQueue).to(headersExchange).whereAny(map).match();
    }


}
